#pragma once
#include <QObject>
#include <QMap>
#include <QString>
#include "QsUdpGlobal.h"
#include "QsUdp.h"

/**
 * @brief UDP多实例管理类
 * 
 * 支持同时监听多个端口或多实例并存，便于动态添加、移除和查找。
 */
class QsUdpManager : public QObject
{
    Q_OBJECT
public:
    explicit QsUdpManager(QObject* parent = nullptr);

    /**
     * @brief 添加实例
     * @param info UDP信息结构体
     * @param name 实例名称（可选，默认用端口号字符串）
     * @return 新建或已存在的实例指针
     */
    QsUdp* addInstance(const QsUdpInfo& info, const QString& name = QString());

    /**
     * @brief 移除实例
     * @param name 实例名称
     */
    void removeInstance(const QString& name);

    /**
     * @brief 通过名称获取实例
     * @param name 实例名称
     * @return 实例指针
     */
    QsUdp* getInstance(const QString& name) const;

    /**
     * @brief 通过端口查找实例
     * @param port 端口号
     * @return 实例指针
     */
    QsUdp* findByPort(quint16 port) const;

    /**
     * @brief 获取所有实例
     * @return 实例指针列表
     */
    QList<QsUdp*> allInstances() const;

    /**
     * @brief 获取全局唯一管理器
     */
    static QsUdpManager* global();

    /**
     * @brief 全局静态发送接口，通过name指定实例，线程安全
     * @param name 实例名称
     * @param msgType 消息类型
     * @param data 数据内容
     * @param r1 保留字段1
     * @param r2 保留字段2
     */
    static void send(const QString& name, quint16 msgType, const QByteArray& data, quint16 r1 = 0, quint16 r2 = 0);

private:
    QMap<QString, QsUdp*> m_instances;
}; 